import { AxiosRequestConfig, AxiosPromise, AxiosResponse } from '../types'
import xhr from './xhr'
import { buildURL } from '../helpers/url'
import { transformRequest, transformResponse } from '../helpers/data'
import { flattenHeaders, processHeaders } from '../helpers/headers'

function dispatchRequest(config: AxiosRequestConfig): AxiosPromise {
  processConfig(config)
  // config转换为response
  return xhr(config).then(res => {
    return transformResponseData(res)
  })
}

// 对config中的数据进行处理的函数
function processConfig(config: AxiosRequestConfig): any {
  config.url = transformURL(config)
  config.headers = transformHeaders(config)
  config.data = transformRequestData(config)
  config.headers = flattenHeaders(config.headers, config.method!)
}

//  get请求的url拼接参数处理
function transformURL(config: AxiosRequestConfig): string {
  const { url, params } = config
  return buildURL(url!, params)
}

// 请求的data的处理
function transformRequestData(config: AxiosRequestConfig): any {
  return transformRequest(config.data)
}

// 处理content-type
function transformHeaders(config: AxiosRequestConfig): any {
  let { headers, data } = config
  // debugger;
  if (!headers) {
    headers = {}
  }
  return processHeaders(headers, data)
}

// 处理返回的data，搞成json格式，返回新的res
function transformResponseData(res: AxiosResponse): AxiosResponse {
  res.data = transformResponse(res.data)
  return res
}

export default dispatchRequest
